/**
 * @param {number[]} nums
 * @return {number[][]}
 */

var threeSum = function (nums) {
    let len = nums.length
    // 末尾指针
    let k
    // 答案
    let ans = []
    // 排序
    nums.sort(
        (a, b) => {
            return a - b
        })
    for (let i = 0; i < len - 2; i++) {
        let j = i + 1;
        k = len - 1
        // 处理重复情况
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue
        }
        while (j < k) {
            if (nums[i] + nums[j] + nums[k] < 0) {
                j++
                // 处理重复情况
                while (j < k && nums[j] == nums[j - 1]) {
                    j++
                }
            } else if (nums[i] + nums[j] + nums[k] > 0) {
                k--
                // 处理重复情况
                while (j < k && nums[k] == nums[k + 1]) {
                    k--
                }
            } else {
                ans.push([nums[i], nums[j], nums[k]])
                j++
                k--
                // 处理重复情况
                while (j < k && nums[j] == nums[j - 1]) {
                    j++
                }
                // 处理重复情况
                while (j < k && nums[k] == nums[k + 1]) {
                    k--
                }
            }
        }
    }
    // console.log(ans)
    return ans
};

threeSum([-1, 0, 1, 2, -1, -4])